home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / assembler / progasm1.lha / SORGENTI / LEZIONE3h.s < prev   
Text File  |  1994-10-30  |  10KB  |  262 lines

  1.  
  2. ; Lezione3h.s    SCORRIMENTO A DESTRA E SINISTRA TRAMITE IL WAIT del COPPER
  3.  
  4.     SECTION    CiriCop,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName(PC),a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary, routine della EXEC che apre
  11.                 ; le librerie, e da in uscita l'indirizzo
  12.                 ; di base di quella libreria da cui fare le
  13.                 ; distanze di indirizzamento (Offset)
  14.     move.l    d0,GfxBase    ; salvo l'indirizzo base GFX in GfxBase
  15.     move.l    d0,a6
  16.     move.l    $26(a6),OldCop    ; salviamo l'indirizzo della copperlist
  17.                 ; di sistema
  18.     move.l    #COPPERLIST,$dff080    ; Puntiamo la nostra COP
  19.     move.w    d0,$dff088        ; Facciamo partire la COP
  20. mouse:
  21.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  22.     bne.s    mouse        ; Se non ancora, non andare avanti
  23.  
  24.     bsr.w    CopperDestSin    ; Routine di scorrimento destra/sinistra
  25.  
  26. Aspetta:
  27.     cmpi.b    #$ff,$dff006    ; Siamo alla linea 255?
  28.     beq.s    Aspetta        ; Se si, non andare avanti, aspetta la linea
  29.                 ; seguente, altrimenti MuoviCopper viene
  30.                 ; rieseguito
  31.  
  32.     btst    #6,$bfe001    ; tasto sinistro del mouse premuto?
  33.     bne.s    mouse        ; se no, torna a mouse:
  34.  
  35.     move.l    OldCop(PC),$dff080    ; Puntiamo la cop di sistema
  36.     move.w    d0,$dff088        ; facciamo partire la cop
  37.  
  38.     move.l    4.w,a6
  39.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  40.     move.l    gfxbase(PC),a1    ; Base della libreria da chiudere
  41.                 ; (vanno aperte e chiuse le librerie!!!)
  42.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  43.     rts
  44.  
  45. ; La routine e' come in LEZIONE3g.s, l'unica differenza e' che si agisce su
  46. ; 29 wait anziche' 1 tramite un loop DBRA che cambia un wait, salta al wait
  47. ; successivo, cambia il wait, salta al wait successivo, eccetera.
  48.  
  49. CopperDESTSIN:
  50.     CMPI.W    #85,DestraFlag        ; VAIDESTRA eseguita 85 volte?
  51.     BNE.S    VAIDESTRA        ; se non ancora, rieseguila
  52.                     ; se e' stata eseguita gia' 85
  53.                     ; volte invece continua di seguito
  54.  
  55.     CMPI.W    #85,SinistraFlag    ; VAISINISTRA eseguita 85 volte?
  56.     BNE.S    VAISINISTRA        ; se non ancora, rieseguila
  57.  
  58.     CLR.W    DestraFlag    ; la routine VAISINISTRA e' stata eseguita
  59.     CLR.W    SinistraFlag    ; 85 volte, dunque a questo punto la barra
  60.                 ; grigia e' tornata indietro e il ciclo
  61.                 ; destra-sinistra e' finito, dunque azzeriamo
  62.                 ; i due flag e usciamo: al prossimo FRAME
  63.                 ; verra' rieseguita VAIDESTRA, dopo 85 frame
  64.                 ; vaisinistra 85 volte per 85 frame, eccetera.
  65.     RTS            ; TORNIAMO AL LOOP mouse
  66.  
  67.  
  68. VAIDESTRA:            ; questa routine sposta la barra verso DESTRA
  69.     lea    CopBar+1,A0    ; Mettiamo in A0 l'indirizzo del primo valore
  70.                 ; XX del primo wait, che si trova appunto
  71.                 ; 1 byte dopo CopBar
  72.  
  73.     move.w    #29-1,D2    ; dobbiamo cambiare 29 wait (usiamo un DBRA)
  74. DestraLoop:
  75.     addq.b    #2,(a0)        ; aggiungiamo 2 alla coordinata X del wait
  76.     ADD.W    #16,a0        ; andiamo al prossimo wait da cambiare
  77.     dbra    D2,DestraLoop    ; ciclo eseguito d2 volte
  78.     addq.w    #1,DestraFlag    ; segnamo che abbiamo eseguito un'altra volta
  79.                 ; VAIDESTRA: in DestraFlag sta il numero
  80.                 ; di volte che abbiamo eseguito VAIDESTRA.
  81.     RTS            ; TORNIAMO AL LOOP mouse
  82.  
  83.  
  84. VAISINISTRA:            ; questa routine sposta la barra verso SINISTRA
  85.     lea    CopBar+1,A0
  86.     move.w    #29-1,D2    ; dobbiamo cambiare 29 wait
  87. SinistraLoop:
  88.     subq.b    #2,(a0)        ; sottraiamo 2 alla coordinata X del wait
  89.     ADD.W    #16,a0        ; andiamo al prossimo wait da cambiare
  90.     dbra    D2,SinistraLoop    ; ciclo eseguito d2 volte
  91.     addq.w    #1,SinistraFlag ; Aggiungiamo 1 al numero di volte che e'
  92.                 ; stata eseguita VAISINISTRA.
  93.     RTS            ; TORNIAMO AL LOOP mouse
  94.  
  95. ; Fate attenzione ad una cosa: cambiamo 1 wait ogni 2 soltanto, non tutti
  96. ; i wait. Ne cambiamo solo la meta' perche', a differenza di quando facciamo
  97. ; scorrere una barra in alto e basso, in cui basta 1 wait per linea
  98. ;
  99. ;    dc.w    $YY07,$FFFE    ; wait linea YY, inizio linea (07)
  100. ;    dc.w    $180,$0RGB    ; colore
  101. ;    dc.w    $YY07,$FFFE    ; wait linea YY, inizio linea (07)
  102. ;    ...
  103. ;
  104. ; In questo caso dobbiamo mettere 2 wait per ogni linea, ossia uno all'inizio
  105. ; della linea e un'altro che scorra a destra e sinistra su quella linea:
  106. ;
  107. ;    dc.w    $YY07,$FFFE    ; wait linea YY, inizio linea (07)
  108. ;    dc.w    $180,$0RGB    ; colore GRIGIO
  109. ;    dc.w    $YYXX,$FFFE    ; wait linea YY, alla posizione orizzontale
  110. ;                ; che decidiamo noi, facendo avanzare il
  111. ;                ; GRIGIO sul ROSSO.
  112. ;    dc.w    $180,$0RGB    ; ROSSO
  113. ;
  114.  
  115.  
  116. DestraFlag:        ; In questa word viene tenuto il conto delle volte
  117.     dc.w    0    ; che e' stata eseguita VAIDESTRA
  118.  
  119. SinistraFlag:        ; In questa word viene tenuto il conto delle volte
  120.     dc.w    0    ; che e' stata eseguita VAISINISTRA
  121.  
  122.  
  123. ;    dati per salvare la copperlist di sistema.
  124.  
  125. GfxName:
  126.     dc.b    "graphics.library",0,0    
  127.  
  128. GfxBase:        ; Qua ci va l'indirizzo di base per gli Offset
  129.     dc.l    0    ; della graphics.library
  130.  
  131. OldCop:            ; Qua ci va l'indirizzo della vecchia COP di sistema
  132.     dc.l    0
  133.  
  134.     SECTION    GRAPHIC,DATA_C
  135.  
  136. COPPERLIST:
  137.     dc.w    $100,$200    ; BPLCON0
  138.     dc.w    $180,$000    ; COLOR0 - Inizio la cop col colore NERO
  139.  
  140.     dc.w    $2c07,$FFFE    ; WAIT - una piccola barretta fissa verde
  141.     dc.w    $180,$010    ; COLOR0
  142.     dc.w    $2d07,$FFFE    ; WAIT
  143.     dc.w    $180,$020    ; COLOR0
  144.     dc.w    $2e07,$FFFE    ; WAIT
  145.     dc.w    $180,$030    ; COLOR0
  146.     dc.w    $2f07,$FFFE    ; WAIT
  147.     dc.w    $180,$040    ; COLOR0
  148.     dc.w    $3007,$FFFE
  149.     dc.w    $180,$030
  150.     dc.w    $3107,$FFFE
  151.     dc.w    $180,$020
  152.     dc.w    $3207,$FFFE
  153.     dc.w    $180,$010
  154.     dc.w    $3307,$FFFE
  155.     dc.w    $180,$000
  156.  
  157.  
  158.     dc.w    $9007,$fffe    ; aspettiamo l'inizio della linea
  159.     dc.w    $180,$000    ; grigio al minimo, ossia NERO!!!
  160. CopBar:
  161.     dc.w    $9031,$fffe    ; wait che cambiamo ($9033,$9035,$9037...)
  162.     dc.w    $180,$100    ; colore rosso, che partira' da posizioni
  163.                 ; sempre piu' verso destra, preceduto dal
  164.                 ; grigio che avanzera' di conseguenza.
  165.     dc.w    $9107,$fffe    ; wait che non cambiamo (Inizio linea)
  166.     dc.w    $180,$111    ; colore GRIGIO (parte dall'inizio linea fino
  167.     dc.w    $9131,$fffe    ; a questo WAIT, che noi cambiaremo...
  168.     dc.w    $180,$200    ; dopo il quale comincia il ROSSO
  169.  
  170. ;    continuiamo risparmiando spazio, osservate lo schema:
  171.  
  172. ; nota: con un "dc.w $1234" mettiamo in memoria 1 word, con "dc.w $1234,$1234"
  173. ; mettiamo in memoria 2 word consecutive, ossia la longword "dc.l $12341234"
  174. ; che avremmo potuto mettere in memoria con un "dc.b $12,$34,$12,$34", dunque
  175. ; possiamo mettere in memoria anche 8 o piu' words con una sola linea dc.w!
  176. ; per esempio la linea 3 si potrebbe riscrivere con il dc.l in questo modo:
  177. ;    dc.l    $9207fffe,$1800222,$9231fffe,$1800300    ossia:
  178. ;    dc.l    $9207fffe,$01800222,$9231fffe,$01800300    con gli zeri *INIZIALI*
  179. ; fate attenzione agli zeri iniziali! un dc.w $0180 lo scrivo con dc.w $180
  180. ; semplicemente per comodita', ma lo zero esiste, va tenuto presente!
  181. ; Per chiarire, la linea 3 completa di zeri iniziali sarebbe:
  182. ;    dc.w    $9207,$fffe,$0180,$0222,$9231,$fffe,$0180,$0300 (1 word =$xxxx)
  183. ; In definitiva gli zeri iniziali "inutili" del .b, .w, .l sono FACOLTATIVI.
  184.  
  185. ;        WAIT FISSI (poi grigio) - WAIT DA CAMBIARE (seguiti dal rosso)
  186.  
  187.     dc.w    $9207,$fffe,$180,$222,$9231,$fffe,$180,$300 ; linea 3
  188.     dc.w    $9307,$fffe,$180,$333,$9331,$fffe,$180,$400 ; linea 4
  189.     dc.w    $9407,$fffe,$180,$444,$9431,$fffe,$180,$500 ; linea 5
  190.     dc.w    $9507,$fffe,$180,$555,$9531,$fffe,$180,$600 ; ....
  191.     dc.w    $9607,$fffe,$180,$666,$9631,$fffe,$180,$700
  192.     dc.w    $9707,$fffe,$180,$777,$9731,$fffe,$180,$800
  193.     dc.w    $9807,$fffe,$180,$888,$9831,$fffe,$180,$900
  194.     dc.w    $9907,$fffe,$180,$999,$9931,$fffe,$180,$a00
  195.     dc.w    $9a07,$fffe,$180,$aaa,$9a31,$fffe,$180,$b00
  196.     dc.w    $9b07,$fffe,$180,$bbb,$9b31,$fffe,$180,$c00
  197.     dc.w    $9c07,$fffe,$180,$ccc,$9c31,$fffe,$180,$d00
  198.     dc.w    $9d07,$fffe,$180,$ddd,$9d31,$fffe,$180,$e00
  199.     dc.w    $9e07,$fffe,$180,$eee,$9e31,$fffe,$180,$f00
  200.     dc.w    $9f07,$fffe,$180,$fff,$9f31,$fffe,$180,$e00
  201.     dc.w    $a007,$fffe,$180,$eee,$a031,$fffe,$180,$d00
  202.     dc.w    $a107,$fffe,$180,$ddd,$a131,$fffe,$180,$c00
  203.     dc.w    $a207,$fffe,$180,$ccc,$a231,$fffe,$180,$b00
  204.     dc.w    $a307,$fffe,$180,$bbb,$a331,$fffe,$180,$a00
  205.     dc.w    $a407,$fffe,$180,$aaa,$a431,$fffe,$180,$900
  206.     dc.w    $a507,$fffe,$180,$999,$a531,$fffe,$180,$800
  207.     dc.w    $a607,$fffe,$180,$888,$a631,$fffe,$180,$700
  208.     dc.w    $a707,$fffe,$180,$777,$a731,$fffe,$180,$600
  209.     dc.w    $a807,$fffe,$180,$666,$a831,$fffe,$180,$500
  210.     dc.w    $a907,$fffe,$180,$555,$a931,$fffe,$180,$400
  211.     dc.w    $aa07,$fffe,$180,$444,$aa31,$fffe,$180,$300
  212.     dc.w    $ab07,$fffe,$180,$333,$ab31,$fffe,$180,$200
  213.     dc.w    $ac07,$fffe,$180,$222,$ac31,$fffe,$180,$100
  214.     dc.w    $ad07,$fffe,$180,$111,$ad31,$fffe,$180,$000
  215.     dc.w    $ae07,$fffe,$180,$000
  216.  
  217. ;        WAIT FISSI (poi grigio) - WAIT DA CAMBIARE (seguiti dal rosso)
  218. ;
  219. ;    Come notate per ogni linea servono 2 wait, uno per aspettare l'inizio
  220. ;    della linea e uno, quello che modifichiamo, per definire in che
  221. ;    punto della linea cambiare colore, ossia passare dal grigio che e'
  222. ;    presente dalla posizione 07, al rosso che parte dopo la posizione
  223. ;    assunta dal wait che cambiamo.
  224. ;
  225.     dc.w    $fd07,$FFFE    ; aspetto la linea $FD
  226.     dc.w    $180,$00a    ; blu intensita' 10
  227.     dc.w    $fe07,$FFFE    ; linea seguente
  228.     dc.w    $180,$00f    ; blu intensita' massima (15)
  229.     dc.w    $FFFF,$FFFE    ; FINE DELLA COPPERLIST
  230.  
  231.  
  232.     end
  233.  
  234.  
  235. Ultima cosuccia: se non avete ancora chiaro il discorso degli zeri iniziali
  236. affrontato prima eccovi alcune conversioni "giuste" e "sbagliate":
  237.  
  238.     dc.b    1,2    =    dc.w    $0102    ossia    dc.w    $102
  239.  
  240.     dc.b    42,$2    =    dc.w    $2a02    (42 decimale = $2a Hex)
  241.  
  242.     dc.b    12,$2,$12,41 = dc.w $c02,$1229 = dc.l $c021229
  243.  
  244.     dc.b    12,$22,0 = dc.w $000c,$2200 = dc.w $c,$2200 = dc.l $c2200
  245.  
  246.     dc.w    1,2,3,432 = dc.l $00010002,$000301b0 = dc.l $10002,$301b0
  247.  
  248.     dc.l    $1234567=    dc.b    1,$23,$45,$67
  249.  
  250.     dc.l    $2342    =    dc.b    0,0,$23,$42
  251.  
  252.     dc.l    4    =    dc.b    0,0,0,4
  253.  
  254.     Attenzione all'ultimo esempio:
  255.  
  256.     un dc.l 4 in memoria diventa $00000004, un dc.b 4 diventa $04
  257.     per cui mentre lo 04 nel dc.l si trova preceduto da 3 bytes $00,
  258.     nel caso del dc.b 4 il 4 si posiziona al primo posto, il che e'
  259.     completamente diverso in ASSEMBLER, nonostante si parli sempre
  260.     di un 4!!!!
  261.  
  262.